
 // document.write("<script language='javascript' src='/js/service/WebSocket.js?t=212'></script>");

function myWebSocket(){
//var lockReconnect = false;//避免重复连接的开关
// this.timeout = 5000;//60ms
this.host= "ws://0.0.0.0:9501";
this.ping_send_body = '';
this.WS = null; //避免ws重复连接
this.STATES = [ '表示连接尚未建立。', '表示连接已建立，可以进行通信。', '表示连接正在进行关闭。','表示连接已经关闭或者连接不能打开。'];	
const that = this;
 //-------------------- 建立连接
this.connect = function (){
	if( that.WS == null ){	
		if ("WebSocket" in window){
			try{
				that.WS = new WebSocket(that.host);// // 打开一个 web socket
				that.initEventHandle();
				//lockReconnect = true;
			} catch(e){
				//lockReconnect = false;
			    that.reconnect();//重连
			}
		} else{
			console.log("您的浏览器不支持 WebSocket!");
			that.WS =  null;
		}
	} 
	return that; 
 };
 //-------------------- 重连
  this.reconnect = function()   {
   //  if(lockReconnect) return;
   //  lockReconnect = true;
     //没连接上会一直重连，设置延迟避免请求过多
     setTimeout(function () {
       that.connect();//建立连接
     //  lockReconnect = false;
     }, 2000);
   }
//--------------------- 初始化事件
this.initEventHandle = function()   {
	 
	
					that.WS.onerror = function (err) {
						console.log("Socket onerror...",err,'正在准备重新连接 Socket ...'); 
						that.reconnect();//重连
					};

					//客户端接收服务端数据时触发
					that.WS.onmessage = function (evt) { 
						var received_msg = evt.data;	
						let res = JSON.parse(evt.data);
						if(res.code == 0){
								// console.info("Socket 返回成功",res.message);//{code: 0, message: "I am hear !", data: Array(0)}
						}else{
								console.info("Socket 返回失败",res.message);	
						}
						
					};

					that.WS.onclose = function(){ 	
						console.log("Socket 连接已关闭...",'正在准备重新连接...'); // 关闭 websocket
						that.reconnect();//重连
					};
					
					that.WS.onopen = function(){ 	
						that.sendPing(that.timeout,that.ping_send_body);	
					};
						
					
}

this.set_ping_send_body =function (ping_send_body){
	this.ping_send_body = ping_send_body;
	return this;
};

this.set_timeout =function (timeout){
	this.timeout = timeout;
	return this;
};
this.set_host =function (host){
	this.host = host;
	return this;
};
 
this.send_data =function ($send_body){ 
		console.info("Socket 状态..." ,that.WS.readyState, that.STATES[that.WS.readyState]);	  
		if(that.WS.readyState == 1 ){
				try{				
					let send_body = {'type':'add','data': $send_body};	
					send_body = JSON.stringify(send_body)					
					console.info("Socket 数据发送中...",send_body);
					that.WS.send(send_body);			
					console.info("Socket 数据发送成功...ok");
				}catch(e){
					console.info("Socket 数据发送失败...",e);
				}
		}else{
			// that.WS =  null;
			// that.reconnect();//重连
			setTimeout(function(){
				that.send_data($send_body);
			},2000);
		}
 




 
};
// 强制退出
this.close = function() {
	that.WS.close();
	that.WS = null; // 关闭 对象
};
/**发送心跳
 * @param {number} time 心跳间隔毫秒 默认5000
 * @param {string} ping 心跳名称 默认字符串ping
 *  @param {string} ping_send_body ping_send_body = {'type':'ping','data':{'deviceid': 'EMDRX4X49K'} } ,
 */
this.sendPing = function (timeout,ping_send_body = {'type':'ping','data':{'deviceid': 'EMDRX4X49K'} } ) {
	setInterval(function(){ 	
		if(that.WS !== null){
		// 	console.info("Socket 心跳...",_SEND_BODY, "状态..." ,that.WS.readyState, that.STATES[that.WS.readyState]);	  
			if(that.WS.readyState == 1 ){		
				const _SEND_BODY = JSON.stringify(ping_send_body);		
				that.WS.send(_SEND_BODY);   
				//console.info("心跳数据发送成功...ok");
			}else if(that.WS.readyState == 3){
				that.close ();
			}else if (that.WS.readyState == 0) {
				
			}else if (that.WS.readyState == 2) {
				
			}else{
				
			}
		}else{
			that.reconnect();//重连
		}
	}, timeout);		 
};
	
	


		
		
			
//======
}



 

//=============================
// WebSocket 属性                   以下是 WebSocket 对象的属性。假定我们使用了以上代码创建了 Socket 对象：
// 属性								描述
// Socket.readyState				只读属性 readyState 表示连接状态，可以是以下值：
// 								0 - 表示连接尚未建立。
// 								1 - 表示连接已建立，可以进行通信。
// 								2 - 表示连接正在进行关闭。
// 								3 - 表示连接已经关闭或者连接不能打开。
// Socket.bufferedAmount			只读属性 bufferedAmount 已被 send() 放入正在队列中等待传输，但是还没有发出的 UTF-8 文本字节数。
//=============================
//可以通过onopen、onmessage、onclose和onerror四个事件对socket进行响应
// open	Socket.onopen	连接建立时触发
// message	Socket.onmessage	客户端接收服务端数据时触发
// error	Socket.onerror	通信发生错误时触发
// close	Socket.onclose	连接关闭时触发
//=============================
//WebSocket的方法 WebSocket 方法
// 以下是 WebSocket 对象的相关方法。假定我们使用了以上代码创建了 Socket 对象：
// 方法					描述
// Socket.send()	使用连接发送数据
// Socket.close()	关闭连接
//=============================

　　


